package org.example.jedis;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;

import java.util.Optional;
import java.util.Random;

/**
 * @author PC
 */
public class PhoneCode {
    private final static Logger logger = LoggerFactory.getLogger(PhoneCode.class);

    public static void main(String[] args) {
        //模拟验证码发送
        sendCode("111");
        //校验验证码
        validCode("111", "659414");
    }

    /**
     * 生成随机数字验证码
     *
     * @param digit 位数
     * @return 验证码
     */
    public static String generatorCode(Long digit) {
        Random random = new Random();
        //测试是单线程的，用StringBuilder即可
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < digit; i++) {
            stringBuilder.append(random.nextInt(10));
        }
        return stringBuilder.toString();
    }

    /**
     * 每个手机号每天只能发送三次，验证码放到redis中，设置过期时间
     *
     * @param phone 手机号
     */
    public static void sendCode(String phone) {
        //创建Jedis对象
        Jedis jedis = new Jedis("*", 6379);
        //验证码key
        String codeKey = String.format("VerifyCode%s:code", phone);
        //如果上一个验证码还有效则不允许继续生成
        if (jedis.exists(codeKey)) {
            logger.error("请勿频繁申请发送验证码");
            jedis.close();
            return;
        }
        //手机发送次数key
        String countKey = String.format("VerifyCode%s:count", phone);
        //每个手机每天只能发3次
        int count = Integer.parseInt(Optional.ofNullable(jedis.get(countKey)).orElse("0"));
        if (count == 0) {
            //没有发送次数，第一次发送，设置发送次数为1
            jedis.setex(countKey, 24 * 60 * 60L, "1");
        } else if (count <= 2) {
            //发送次数加1
            jedis.incr(countKey);
        } else {
            //发送三次，不能再发送
            logger.error("发送次数已经超过三次，不能再发送");
            jedis.close();
            return;
        }
        //发送验证码放到redis里边
        String vCode = generatorCode(6L);
        logger.info("生成验证码: {}", vCode);
        jedis.setex(codeKey, 120L, vCode);
        //关闭连接
        jedis.close();
    }

    /**
     * 验证校验码
     *
     * @param phone     手机号
     * @param inputCode 输入的验证码
     */
    public static void validCode(String phone, String inputCode) {
        //创建Jedis对象
        Jedis jedis = new Jedis("*", 6379);
        //验证码key
        String codeKey = String.format("VerifyCode%s:code", phone);
        if(StringUtils.equals(jedis.get(codeKey), inputCode)){
            logger.info("验证成功");
        }else {
            logger.error("验证失败");
        }
        //关闭连接
        jedis.close();
    }
}
